First note, that even determining if a crossword is "solveable" using the given dictionary is NP-Hard1, so even determining if there is 0 or more solution cannot be done polynomially (unless P=NP).
Thus, the alternative is using an exhaustive search solution - just try all possibilities to "place" the words, and then verify if this solution is valid.
Pseudo code:
solve(words,grid):
if words is empty:
if grid.isValidSolution():
print grid as a possible solution
return
for each word in words:
candidate<- grid.fillFirstSpace(word)
solve(words\{word},candidate)
(1) Reference: Is P equal to NP section 3.3