The first method is trying to take a decimal (the result of adding the 2 decimals) and cast it as a string. Since there's no (implicit or) explicit conversion from decimal to string, it throws because of the mismatch.
The second one takes a decimal and calls a ToString() method on it - since ToString is a valid method on the decimal type, this makes a normal instance method call and you get the return value of that call, which is a string.
Since you're using Convert calls already, you might find it more natural to do Convert.ToString to get the decimal back to a string.
It might be more clear if you separate the 'add two decimals' to a separate local var, since that's common to both here.
So, the (commented out) total1 fails because it's trying to just cast, and we have no conversion available to do so. The latter two both work fine, since they are method calls that are returning a string.
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);