The issue is the Measures.AllMembers set you are using in the CASE statement. As the error says, a CASE Statement needs a string or numeric value. But you could re-write this much more efficiently without a case statement using a series of direct assignments and one scope:
[Measures].[MTD] = IIF ([Measures].[MTD] = 0 AND [Measures].[QTD] = 0 AND [Measures].[YTD] = 0, null, [Measures].[MTD]);
[Measures].[QTD] = IIF ([Measures].[MTD] = 0 AND [Measures].[QTD] = 0 AND [Measures].[YTD] = 0, null, [Measures].[QTD]);
[Measures].[yTD] = IIF ([Measures].[MTD] = 0 AND [Measures].[QTD] = 0 AND [Measures].[YTD] = 0, null, [Measures].[YTD]);
// this applies to all measures except MTD, QTD and YTD
SCOPE ( Measures.AllMembers - {[Measures].[MTD],[Measures].[QTD],[Measures].[YTD]})
this = IIF ([Measures].[MTD] = 0 AND [Measures].[QTD] = 0 AND [Measures].[YTD] = 0, null, [Measures].[MTD]);
END SCOPE
However even then what you are trying to do does not make much sense to me. Where are these 0 values coming from? Can you avoid loading them into the cube in the first place and avoid having this extra logic?