Язык C # здесь совершенно неактуален. Вопрос в том, как перехват работает на уровне времени выполнения.
Один из методов наследуется от класса / реализует интерфейс и использует его в качестве прокси. Очевидно, что это может переопределить только виртуальные методы и методы интерфейса Я подозреваю, что Виндзор использует эту технику. Преимущество этой техники в том, что ей не нужно ничего особенного. Просто создайте класс во время выполнения.
Другой способ - использовать API профилирования. Это позволяет изменять IL любого метода, в том числе не виртуального. Это гораздо более навязчиво и обычно используется только при тестировании устаревшего кода.
Еще один способ - перезапись IL во время сборки. Это может добавить точки перехвата в код, который вы написали, но не в коде фреймворка.