CGA and VGA are incompatible in their video signal timing, so either a CGA-capable monitor or some kind of flicker fixer is needed.
I developed a primitive one using a MAX10 development board and tested it using a Compaq Portable III.
The FPGA design just synchronizes with CGA's timing signals and stores the sampled RGBI values (CGA is 4BPP digital TTL) into a dual-port block memory. The VGA part just grabs the pixel values from there and displays them as a letterboxed part of a 640x480@25MHz VGA signal.
The converter in action:
The converter itself:
Video with Composite artifact emulation:
https://twitter.com/_stderr/status/967460271357878272