It's way simpler to have the client have its own copy of the game state, and allow 'query' methods (methods that fetches data about the game state but don't modify it). Having to wait for the server for the set of legal moves feels like a hack.
Sharing the code between the client and the server brings a lot to the table. I spent the last two years coding a reimplementation of A Game of Thrones: The Board Game, and I would use this paradigm if I had to recode it.