One problem is that OpenGL commands are buffered before execution. When using a software swap synchronization (like u seem to do with ur wait-notifyall structure), call glFinish before entering the swap barrier to complete all outstanding OpenGL commands. But beware, glFinish is bad for the performance especially in SLI/Crossfire environments.
Also if the synchronization has to be perfect at least to my knowledge the is no way around a hardware solution like nVidia GSync to synchronize the video signal and buffer swap. Take a look here:
http://www.nvidia.com/page/quadrofx_gsync.htmlBut don't panic normally a software synchronization is often good enough in most cases ... :)
Another common approach when it comes to synchronized rendering over multiple monitors/devices is to simply use SLI/Crossfire and make the two GPUs one rendering device. To do the mutlimonitor rendering simply make a window wich spans across 2 monitors and render 2 different projections side-by-side in one thread (e.g. using FBOs). This eases u from all synchronization stuff and if u program carefully u get the full power of both GPUs.