first of all, what is gameplay interaction between two boards? or it's just than one player can see the progress of second one?
In O'Reilly's Java NIO the author is converting multiplayer tetris from regular IO stryle to NIO
There when you complete a row(s) opponent gets row(s) of random garbage.
Anyway don't know much about networking, just started, my initial idea, p2p or client-server:
You connect 2 pcs, server sends start msg and his inital falling objects (first two, first one to start falling and second one that is next to fall) and client responds with what will his first two falling objects be.
Game engine starts to process these, each in own seperate board, on both sides, but localy for opponents board dosen't calculate any points or whatever, just the visual process of falling and so on.
When local player changes rotation of falling object or speeds it down you send a message what happened to other player. Other player receives it and his game engine process it.
When falling object falls localy you send a message of status of your board (what squares are filled). Other player receives it, his game engine process it. Now your opponent board and his local board should be the same. If object made filled a row game engine should process it exactly on your and opponents board, since you have info how the objects fell exactly.
You create new random falling object and send message to other player what it is, and other player renders it... and process starts again.
Note this is just my opinion, I neved created a single network game but I'm working on one right now
Also in this case it's very important that message that signals status of board gets received... if you lose a message about rotation, no biggie, you'll just won't see how opponent rotated object when falling, but if you lose status message, boards won't be syncronized until next status message comes (when opponent places next falling object).
I hope it's sounds clear what I said.