The synchronization is possible via polling, but it could also be done by interrupt even when no hardware interrupts were provided. It worked on any card that had a "real-time" status register with relevant information. I did that many times along the years, even as late as mid-90s. The trick? Take over the timer interrupt, and use it for two things:
Polling the graphics card status. This could be the CRT controller (CRTC) scan registers, so that the current screen refresh position was known, or a status bit that indicated vertical retrace. The status has to be polled long enough to capture event we're interested in. The number of loop repetitions before the event is captured provides the phase information.
Running a phase-locked loop using the timer interrupt period, using the phase feedback obtained above.
There was some finesse to it so that, in practice, the time wasted for phase-detection polling was minimized. What really happened was that the phase jitter was estimated, and the timer interrupt was triggered only as early as warranted by the jitter. On systems with low jitter, sometimes just a couple of loop iterations sufficed to capture the event (e.g. a status bit changing state, or a CRTC register reaching the desired value). There were also provisions for dealing with sporadic high latency, usually introduced by poorly designed device drivers for other hardware. Interrupt handler interrogated the CTC (counter timer) registers to determine how late it was actually invoked (due to interrupts being blocked), and acted accordingly.
I'm not sure how widespread such practice was, but the approach was so generic that it could be adapted for completely "black box" graphics cards, where no VSYNC feedback was available. Then the trick was to use a simple adapter that fed the VSYNC signal from the graphics card output to a parallel port input pin.
There were few uses for such synchronization, but when you needed it - you couldn't do without it. I remember using this on Tseng cards with multisync NEC monitors to support 80Hz refresh for 3D wireframe visualization with LCD shutter goggles.