Я вижу два варианта - простой и правильный.
Простой состоит в том, что все ваши методы будут иметь сигнатуры базового класса, и в каждом наследнике вы будете кастовать аргументы к нужному типу:
if (args is ConcreteArgs concreteArgs)
{
// do something with concreteArgs
}
Это в целом не очень удобно, но просто и работает.
Правильный (на мой взгляд) вариант состоит в том, чтобы использовать шаблон программирования "посетитель", вот на хабре есть статья где рассматривается вычисление площади различных фигур -
https://habr.com/ru/post/332042/.
Ещё есть вариант сделать класс generic, который принимает тип аргументов, и наложить констрейнт
where T : FunctionArgs
.