Для этого ли нужны делегаты?
Делегаты - это реализация функтора на платформе .net. Функтор - это распространенная в современных языках базовая концепция, пришедшая из функционального программирования. Коротко её смысл в том, чтобы работать с функцией как со значением, наравне со значениями других, более привычных типов, вроде int или double. Т.е. функцию можно передавать в другие функции, возвращать из функций и так далее. В функциональных языках это обычное дело, однако и в императивных языках это даёт массу возможностей.
Количество применений делегатов в дотнете вообще и конкретно в C# огромно. Собственно, сам язык сегодня является частично функциональным из-за того, что широко используются делегаты и основанные на них возможности. Любая лямбда может быть скомпилирована в делегат. LINQ to Objects основаны на делегатах. События есть инкапсулированные делегаты. Любые callback-и в дотнете это делегаты. Список можно продолжать
Сравнивая C# с другими языками, делегаты часто называют "умными указателями на функции" в том смысле, что они похожи на указатели на функции в Си, но умеют еще и запоминать объект, для которого требуется вызвать метод, если метод нестатический. А вот в C++ есть прямой их аналог - это std::function.
В общем, почитайте еще про них. Я даже не понимаю, к чему вы привели свой пример, и что он, по вашему мнению, должен продемонстрировать. Логично, что вы не смогли создать делегат, т.к. инстанс-метод невозможно вызвать без привязки к конкретному объекту.
Нет, это не жизненный пример. Это вообще очень странный пример, и никто в здравом уме не будет вызывать нестатический метод на имени типа. В данном случае расово верным и единственным рациональным решением было бы обратиться к этому методу, как var ret = instance.Method("string");.
Однако, возвращаясь, собственно, к теме самих делегатов и их жизненного применения. Самым классическим примером была бы реализация функции Where (которая поставляется в LINQ).// in static class
IEnumerable<TElement> Where(this IEnumerable<TElement> source, Predicate<TElement> filter){
   // для простоты опустим проверки и т.д.
   foreach(TElement elem in source)
      if(filter(elem)) yield return elem;
}
// ... usage ...
var list = new List<int> { 1, 2, 3, 4, 5, 6 };
var ret = list.Where(elem => elem % 2 == 0);
foreach(int e in ret)
   Console.Write(e + " ");
// ...
В данном случае функция перебирает каждый элемент в перечислении source, вызывает функцию filter (функция, которая принимает значение типа TElement и возвращает bool), и возвращает текущий элемент, если возвращённое filter значение было true.
После выполнения фрагмента кода, на экран было бы выведено "2 4 6 ".