単純なインターフェース使う例だとこんなもんかな
受け取る結果の型が決まってるなら、dynamic使わんで済むけど
public interface IJob
{
dynamic Run();
}

public class SomeJob<T1, T2> : IJob
{
public T1 Param1 {get;}
public T2 Param2 {get;}

public SomeJob(T1 param1, T2 param2)
{
Param1 = param1;
Param2 = param2;
}
public dynamic Run() => (dynamic)Param1 + (dynamic)Param2;
}

public static void Main()
{
var dic = new Dictionary<string, IJob>()
{
{"a", new SomeJob<int, double>(2, 3.3) },
{"b", new SomeJob<float, double>(5.5f, 16.612340) },
};
Console.WriteLine(dic["a"].Run());
Console.WriteLine(dic["b"].Run());
}