Me importa un rábano que discutas lo que sé yo desde que programaba para el Windows 3.1. Lo que no puedes hacer nunca es discutir lo que dice la MSDN, a no ser que seas Mark Russinovich.
Repito, de la MSDN:
Normalmente, el objeto Graphics que se recupera a través del método CreateGraphics no se debería conservar una vez procesado el mensaje actual de Windows.
https://docs.microsoft.com/es-es/dotnet/api/system.windows.forms.control.creategraphics?view=netframework-4.8
Y lo más correcto de todo es usar el Graphics dentro de una función Paint, que se llamará el llegar a la cola de mensajes un mensaje WM_PAINT. No suele hacer falta crearlo en una función distinta.
https://docs.microsoft.com/es-es/dotnet/api/system.drawing.graphics?view=netframework-4.8
Propiedades de Graphics:
Clip
Obtiene o establece un Region que limita la región de dibujo de este Graphics.
ClipBounds
Obtiene una estructura RectangleF que delimita la región de recorte de este Graphics.
CompositingMode
Obtiene un valor que especifica cómo se dibujan las imágenes compuestas en este Graphics.
CompositingQuality
Obtiene o establece la calidad de representación de las imágenes compuestas que se dibujan en este Graphics.
DpiX
Obtiene la resolución horizontal de este Graphics.
.....
Métodos de Graphics:
AddMetafileComment(Byte[])
Agrega un comentario al Metafile actual.
BeginContainer()
Guarda un contenedor de gráficos con el estado actual de este Graphics y abre y usa un nuevo contenedor de gráficos.
BeginContainer(Rectangle, Rectangle, GraphicsUnit)
Guarda un contenedor de gráficos con el estado actual de este Graphics y abre y usa un nuevo contenedor de gráficos con la transformación de escala especificada.
BeginContainer(RectangleF, RectangleF, GraphicsUnit)
Guarda un contenedor de gráficos con el estado actual de este Graphics y abre y usa un nuevo contenedor de gráficos con la transformación de escala especificada.
Clear(Color)
Borra toda la superficie de dibujo y la rellena con el color de fondo especificado.
CopyFromScreen(Int32, Int32, Int32, Int32, Size)
Realiza una transferencia de bloque de bits de los datos de color, correspondientes a un rectángulo de píxeles, desde la pantalla a la superficie de dibujo de Graphics.
CopyFromScreen(Int32, Int32, Int32, Int32, Size, CopyPixelOperation)
Realiza una transferencia de bloque de bits de los datos de color, correspondientes a un rectángulo de píxeles, desde la pantalla a la superficie de dibujo de Graphics.
CopyFromScreen(Point, Point, Size)
Realiza una transferencia de bloque de bits de los datos de color, correspondientes a un rectángulo de píxeles, desde la pantalla a la superficie de dibujo de Graphics.
CopyFromScreen(Point, Point, Size, CopyPixelOperation)
Realiza una transferencia de bloque de bits de los datos de color, correspondientes a un rectángulo de píxeles, desde la pantalla a la superficie de dibujo de Graphics.
CreateObjRef(Type)
Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto.
(Heredado de MarshalByRefObject)
Dispose()
Libera todos los recursos utilizados por este Graphics. Y añado yo, libera el HDC de la ventana, para que pueda usarlo el Windows.
.......
Difícilmente vas a encontrar mejores ejemplos de código que los que pone Microsoft en la MSDN
https://docs.microsoft.com/es-es/dotnet/api/system.drawing.graphics.dispose?view=netframework-4.8
Come verás, en ese ejemplo llama al CreateGraphics dentro de una función Paint.