В C # вы можете создавать любые сборки, связывать их как файлы DLL, а затем делать все, что захотите.
Обычным случаем может быть определение некоторого интерфейса плагинов, который должен быть реализован всеми плагинами.
Затем вы можете загрузить все плагины из файловой системы (перебирая библиотеки DLL плагинов), найти класс внутри, который реализует интерфейс, создать его экземпляр и работать с ним.
Если вы хотите обеспечить плагины с возможностью выгрузки и безопасностью, вы можете создать домен приложения и загрузить в него плагины, что повышает сложность, но также повышает стабильность (плохой плагин не приведет к сбою приложения).
Пожалуйста, спросите более конкретно, если вы хотите конкретный ответ: -)