Это потому, что MessageBox.Show("")
это вызов метода, а не делегат, поэтому
TryDo.Do(MessageBox.Show(""),null);
на самом деле пытается вызвать TryDo.Do
с результатом MessageBox.Show
вызова.
Вам действительно нужно передать делегата, который содержит метод, который вы пытаетесь вызвать, потому что
TryDo.Do(MessageBox.Show,null);
также завершится с ошибкой, что метод не может быть приведен в качестве делегата.
Самый простой способ создать делегат из метода - это использовать универсальные делегаты Func<..>
и Action<...>
(Func для тех методов, которые возвращают что-то, Action для тех, которые являются недействительными), например:
var myDelegate = new Func<string, DialogResult>(MessageBox.Show);
TryDo.Do(myDelegate, null)