I found the problem on our side, but there may be something you want to change on your side too.
We were under some circumstances returning true for IsFrameBufferAvailable, but then false from DrawOpenGl, due to insufficient synchronisation between two threads for the boolean in question. This caused Rhino to call IsFrameBufferAvailable once, get the true, and then call DrawOpenGl forever without ever calling IsFrameBufferAvailable again. Possibly, it should just give up after the first time and wait for the next SignalRedraw instead, and in any case, I think it ought to call IsFrameBufferAvailable each time just in case, which would have also solved our problem for us.
The synchronisation problem on our side is rather involved, and I may end up always returning true from DrawOpenGl for now, and simply drawing the most recent frame again, if it should be entered twice. As long as IsFrameAvailable starts returning false soon, which it will in our case, then there should be no problem with that, I think.
We have also seen surprisingly long sequences of IsFrameBufferAvailable calls to us, with no action, we return false each time, at least tens, maybe hundreds of them. Waiting for SignalRedraw again seems like a better solution, after the first false.
Finally, for some reason, we often see an orange HUD bar, and occasionally a white frame at the end of the sequence, after convergence. Any idea why this happens?