This is actually a quite simple assignment and I'm 100% sure you can already find functional solutions to it.
1) Just take some random numbers:
choose(X,Y) :- random(X), random(Y).
then unify your grid variable with (, X, Y) to create an empty grid. Printing the grid is then trivial recursive traversal of the list.
2) Take some crossword dictionary from the net, there are millions of them and do
dict(D, [firstWord, secondWord, thirdWord,...]).
3) choose random index in D, that has not been already selected (maintain a list of selected words)
4) Use the same swapping strategy you had in your operating systems course: best-fit, first-fit, worst-fit or next-fit.