This is inevitable, it can marshal any delegate type. The only way to do that is to use DynamicInvoke(). They did make the effort to pick off some common delegate types you'd use in Winforms programming but that can never be an exhaustive list without losing the benefit of doing so. There is little point in worrying about the cost, this always involves a thread context switch and the latency of the Winforms message loop responding to the PostMessage(). The cost of DynamicInvoke() is small potatoes compared to that.
And yes, you do have to do something to avoid getting slapped by the outer-most exception, the TargetInvocationException isn't useful to anybody. The Winforms Control.Invoke() method does that by re-throwing only the inner-most InnerException. That's not ideal either but better than TIE.