Ich lasse gewöhnlich den Anwender entscheiden, wie breit er seine Spalten haben möchte, und speichere die Abmessungen in einer extra Tabelle, in der nur solche Anwender-Daten hinterlegt werden.
Dito, nur streame ich die DBGrid.Columns in ein Blob-Feld. Damit spart man sich das Iterieren und hat aber auch gleich andere Eigenschaften (wie zB Lookup-Listen u.ä.) mit drin.