Well your physics is updating, it's just the visuals that aren't!

Your problem is that when you call the dropDownSquares() function, it sets the deleted square equal to the one above it (which includes its rectangles X and Y values).

Here's a quick fix, you might wanna find a prettier one, given that the rest of your code is nicely organised:

New dropDownSquares:

public void dropDownSquares(int row) { for (int i = row; i > 0; i--) { for (int j = 0; j < boardCols; j++) { moveCell(i, j, board[i - 1, j]); deleteCell(i - 1, j); } } }

where the moveCell function is just the fillCell with the changed Y value added:

public void moveCell(int row, int col, Square sq) { board[row, col] = sq; if(sq!=null)board[row, col].square.Y += 16; }