C #: el método genérico no llama a una sobrecarga específica del método

Estoy tratando de crear un método genérico en C #, que llamará a diferentes métodos basados en el tipo de datos de argumento en su cuerpo y procesará su resultado después. Estoy tratando de lograr esto creando un método genérico de envoltura y luego proporciono varias sobrecargas del método de procesamiento, incluido uno genérico que se usará si no hay disponible una sobrecarga específica.

Cuando llamo al método de procesamiento directamente, se selecciona correctamente la versión adecuada. Sin embargo, cuando lo llamo desde el método contenedor, siempre selecciona el genérico, incluso si hay una sobrecarga coincidente para el tipo de datos específico que le pasé.

¿Hay alguna forma de ajustar el código para que se comporte como lo necesito? ¿O tengo que usar un enfoque diferente?

Necesito que el código sea compatible con Mono 2.6.

using System;

class Program
{
    static void Func<T>(T val)
    {
        Console.WriteLine("Generic Func");
    }

    static void Func(int val)
    {
        Console.WriteLine("Int Func");
    }

    static void Func(string val)
    {
        Console.WriteLine("String Func");
    }

    static void FuncWrap<T>(T val)
    {
        Console.Write("Wrap: ");
        Func(val);
    }

    static void Main(string[] args)
    {
        Func(2);
        Func("Potato");
        Func(2.0);

        FuncWrap(2);
        FuncWrap("Potato");
        FuncWrap(2.0);

        Console.Read();
    }
}