Evidentemente la tua libreria di comunicazione lavora da un thread separato; nel momento in cui sollevi l'evento, chiami il delegato da un thread indipendente da quella della GUI. Per questo motivo, nel delegato vai a modificare un oggetto GUI da un thread non-GUI, il che non è consentito (in generale, gli oggetti GUI non sono thread safe).
Per questo motivo è necessario fare il giretto che hai visto: la "Invoke" di fatto non fa che invocare il delegato specificato dal thread della GUI dell'oggetto su cui viene chiamata, thread da cui è possibile modificare gli oggetti GUI.
Questo "sotto il cofano" è implementato con una SendMessage sulla finestra specificata: il messaggio viene postato sulla coda dei messaggi della finestra, e viene recuperato nel thread GUI (dove gira la message pump); al momento di processarlo, viene chiamato il delegate specificato dal thread giusto, restituendo il risultato poi al thread della Invoke.