Первый метод пытается взять десятичную дробь (результат добавления 2-х десятичных дробей) и привести ее как строку. Так как нет явного (неявного или) явного преобразования из десятичного в строковое, оно выбрасывается из-за несоответствия.
Второй принимает десятичное число и вызывает для него метод ToString () - поскольку ToString является допустимым методом для десятичного типа, это вызывает обычный вызов метода экземпляра, и вы получаете возвращаемое значение этого вызова, которое является строка.
Поскольку вы уже используете вызовы Convert, вы можете найти более естественным сделать Convert.ToString, чтобы вернуть десятичную строку обратно в строку.
Возможно, будет более понятно, если вы разделите 'добавить два знака после запятой' к отдельной локальной переменной, так как здесь это общее для обоих.
Итак, (закомментировано) total1 завершается ошибкой, потому что он пытается просто разыграть, и у нас нет доступных для этого преобразований. Последние два работают нормально, так как они являются вызовами методов, которые возвращают строку.
string a = "100.00", b = "50.00";
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b);
//string total1 = (string)result;
string total2 = result.ToString();
string total3 = Convert.ToString(result);