Isso é feito tão simples quanto copiar todo o buffer de memória para o conector de saída na sua taxa de atualização. Ou seja, em um monitor padrão conectado via DVI, ele enviaria 60 quadros por segundo completos de 1920x1080 pixels com 24 bits por pixel (profundidade RGB de 8 bits). Isso é um monte de dados e requer cabos curtos de alta qualidade.
Internamente, pode se tornar muito mais complicado. Normalmente, a RAM de vídeo armazena 2 ou 3 buffers de dados de imagem (buffer duplo ou buffer triplo, para reduzir o tearing, o que significa essencialmente que o buffer enviado para o conector de saída não é modificado pelos drivers do SO).
E isso pode se tornar ainda mais complicado: o conector de saída pode ser analógico, o que significa que haverá um DAC que converte cada sinal em sinais analógicos. Ou, a RAM pode usar uma profundidade de bits maior que o monitor (10 bits por cor = 30 bits por pixel), as placas gráficas podem usar pontilhamento temporal quando o dispositivo de saída tem uma profundidade de bits menor (então o erro de 2 bits é distribuído para a próxima quadro que pode resultar em ruído leve e visível, mas proporciona melhor sombreamento de cor).
E ainda mais complicado: algumas GPUs não organizam a memória da mesma maneira que é exibida no monitor (linhas de pixels da parte superior esquerda para a direita inferior), mas organizam a memória nas células (retângulos dos dados da imagem) - isso precisa ser convertido, mas pode resultar em maior desempenho do acesso à VRAM, porque o acesso simultâneo da GPU, da CPU e do processador de sinal é melhor distribuído entre si.
Assim, no básico, é muito simples: os dados são copiados do buffer de RAM para o conector de saída, pixel por pixel, na maioria das vezes alterando o buffer de imagem entre cópias toda vez que um quadro completo é enviado. O monitor segue o mesmo padrão de tempo e desenha os pixels. Em cada quadro, os timers serão ressincronizados para que o monitor inicie no canto superior esquerdo.