Poczytaj o zasadach solid, szczególnie SRP
W testach używaj arrange act assert (lub inny odpowiednik)
Poczytaj o property i {get; private set;}
Staraj się rozdzielać wszystko na klasy o wspomnianej pojedynczej odpowiedzialności
na razie masz w wielu miejscach, takie wszystko w jednym
Zajrzałem na projekt TicTacToe.NET i na podstawie tego, mam takie wnioski
Zauważyłem też, że tworzysz wiele solucji
W obrębie jednego projektu tworzymy jedną solucje, a wewnątrz niej wiele projektów z nazewnictwem Solucja.Projekt
np
Tetris.Web
Tetris.Persistance
Tetris.Common
Tetris.Tests.UnitTests
Tetris.Tests.EndToEnd
Gdzie każdy z projektów ma pojedynczą odpowiedzialność, np Tetris.Persistance powinno odpowiadać za zapis i odczyt danych
Common to pomocnicze klasy, które nie wiedzą czym zajmuje się projekt
Web to ta mechanika związana, z komunikacją z użytkownikiem przez sieć
Itd, co ci przyjdzie do głowy
Myślę, że jeśli weźmiesz się za wzorce projektowe będzie fajnie, na razie niezbyt mi się to podoba, ale chyba głównie z tego względu