Q:

Можно ли создать класс-обертку для асинхронизации методов?

Допустим у нас есть класс внутри которого много синхронных методов:
public class A
{
    public int Return5() => 5;

    public string ReturnString() => "string";
}

Можно ли создать класс обертку для асинхронизации синхронных методов? Тоесть чтобы на каждый синхронный метод создавался такой же только с возвращаемым типом Task<> и вконце названия метода добавлялось окончание Async.  Допустим чтобы это выглядело так:
var asyncA = new AsyncClass<A>;

var result = await asyncA.ReturnStringAsync();

A:

Технически можно, но это обычно не нужно.
Если узкое место у метода — потребление процессора, лучше выставить синхронный интерфейс. Тогда клиенты могут легко запустить задание асинхронно сами:
var five = await Task.Run(() => a.Return5());

А могут и не запускать асинхронно, если методу это не нужно.
То есть в этом случае просто выставляйте синхронный метод, клиенты сами могут легко превратить его в асинхронный.

А вот если же метод не занимает поток для своего выполнения (например, он грузит что-нибудь из интернета, пользуясь async-функциями), тогда нужно выставлять только асинхронный метод. Соответственно вы не сможете выставлять синхронный метод, разве что искусственно создать его через Task.Wait() (что снова-таки не нужно, ведь клиент при желании может сделать это сам).

Дополнительное чтение по теме от одного из ключевых разработчиков асинхронных фич C#: Should I expose synchronous wrappers for asynchronous methods?

Как технически сделать асинхронную обёртку? Например, через Task.Run:
public class AsyncA
{
    private A a = new A();
    public Task<int> Return5Async() => Task.Run(() => a.Return5());
    // и т. д.
}

