Cada celda recibe variables tipo objeto por lo que puedes almacenar cualquier cosa. Si al objeto puede hacérsele casting a una imagen o a texto entonces se verá su contenido. Si el objeto no puede tener casting entonces saldrá el nombre de la variable.
El contenido es modificable en tiempo real.
Sobre el tamaño en bytes, no lo sé. Sólo la he probado con arreglos de objetos pequeños.
Leyendo la ayuda en línea...
http://msdn.microsoft.com/es-es/library/system.windows.forms.datagridview%28VS.80%29.aspxAl trabajar con grandes cantidades de datos, puede establecer la propiedad VirtualMode en true para mostrar un subconjunto de los datos disponibles. El modo virtual requiere la implementación de una caché de datos a partir de la cual se llenará el control DataGridView. Para obtener más información, vea Modos de presentación de datos en el control DataGridView de formularios Windows Forms.
... informa que si el contenido de la grid es amplio, se puede usar una sub-sección de la misma para mostrarla en pantalla. Lo demás está almacenado en otro lado. He visto que es un poco lenta al llenarse (no tan lenta) y pues esto del VirtualMode y la caché talvez te sea de utilidad.
Código de ejemplo para Basic está en el mismo link. Ojo, es para VS 2005 en adelante.