В данном случае — то, что мы не знаем типы аргументов и возвращаемого значения, и делегат у нас — сферический в вакууме. Но такая ситуация слегка надуманная, да.
Ваш вариант тоже вариант, но…
Во-первых: делегат тогда должен иметь параметры тех типов, которые могут быть неизвестны.
Во-вторых: делегат можно создать только для конкретного экземляра
А как потом работать с типами, которые неизвестны? Создать экземпляр для передачи в параметрах там, или что-то получить из возвращенного значения?
Весь код через динамические методы переписывать? А кто это потом не поленится поддерживать? :)
Быстрый Reflection через DynamicMethod