Fala Ricardo, eu tive essa mesma dúvida e fui pesquisar. A informação que obtive é que não é possível fazer uma predefinição da mascara para vários tamanhos de texto diferentes. Terá que fazer o tratamento via código mesmo.
Eu fiz um código de exemplo para você testar.
Usei o evento validating da MaskedTextbox1.
Reescreva esse código dentro de uma MaskedTextbox para você ver o funcionamento.
O código está comentado, qualquer dúvida é só perguntar.
Não é um código definitivo, mas já te dá um ideia de tratamento da máscara.
private void maskedTextBox1_Validating(object sender, CancelEventArgs e)
{
//Declaração das variáveis
string aux = maskedTextBox1.Text;
string EndMask = "";
string StartMask = "";
int tam = maskedTextBox1.Text.Length;
//Verifica se foi preenchido com casa decimais (se houve ocorrência do uso da virgula)
if (maskedTextBox1.Text.IndexOf(',') >= 0)
{
/*Posição relativa da vírgula dentro da string
*Escreve a parte inteira da máscara.
*Por exemplo: 1234,65. A vírgula destá na 4° posição logo, o i vai ser 4,3,2 e 1 (4 repetições de loop)*/
int i = maskedTextBox1.Text.IndexOf(',');
while (i > 0)
{
StartMask += Convert.ToString(0);
i--;
}
/*Escreve a parte decimal da máscara.
*No caso do exemplo anterior, o tamanho da string é 7. Logo, o valor inicial de i vair ser (7-4)-1=2.
*Duas casas decimais*/
i = (tam - maskedTextBox1.Text.IndexOf(',')) - 1;
while (i > 0)
{
EndMask += Convert.ToString(0);
i--;
}
}
//Define a Máscara
maskedTextBox1.Mask = "$" + StartMask + ","+ EndMask;
//Reescreve o texto, quando se reescreve a máscara o texto apaga
maskedTextBox1.Text = aux;
}