4x4 word grid generator in Python
Your problem is here:

for i in itertools.product(words, repeat = N):


This brute-force approach is why it's taking so long. Let \$k\$ be the
number of \$N\$-letter words. For two or three letters, the time is
proportional to \$k^2\$ or \$k^3\$. Bad enough, but for four letters, it's
\$k^4\$, which is horrendous. \$k\$ is probably significantly larger for
four letters as well, depending on your word list.

So, we need to drastically prune the number of combinations to try.
There are many ways this might be done. One idea would be to prune
things a row at a time. Suppose the first row is "ACHE". Look at all
words beginning with "A". None begin with "AA" or "AQ". So the next row
can eliminate all words beginning with "A" or "Q". Similarly, second-row
second letter can't be "B" or "C" or several other things, because no
words begin with "CB" or "CC", etc. This approach should cut way down on
the combinations.