Cute idea. The constraint that all letters must be used is what makes this interesting over just a free-form crossword builder since it turns it into a proper puzzle.
How do you handle validation? Specifically, are you checking connectivity with a union-find or just flood fill from an arbitrary starting tile?