TFont is a class, so a simple assignment creates a pointer to the original class, and changing it affects all instances.
Therefore, you must create a new instance of the class for each cell.
Additionally, TStringGrid has an Objects property, so you don’t need to implement your own workarounds.
I’ve implemented both changes and handled the update for selected cells - see the attachment.