I totally agree with @TeeSee1 that a spreadsheet expression or GAS may be a better option. I believe the following expression and some other compact variants of it will work. However they are not likely to be much more compact. With such requirements , there could be variations such as first name or surname is just one string or more than two strings. The below will work for first name and surname both having up to two strings as per your given example.
Long expressions such as below are more for academic purpose rather than recommended to be used. Best is to use spreadsheet or GAS approach in this case.
CONCATENATE(
UPPER(LEFT(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),1),1)),
LOWER(MID(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),1),2,(LEN(UPPER(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),1)))-1))
), " ",
UPPER(LEFT(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),2),1)),
LOWER(MID(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),2),2,(LEN(UPPER(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),2)))-1))
) , " ",
UPPER(LEFT(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),3),1)),
LOWER(MID(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),3),2,(LEN(UPPER(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” “),3)))-1))
),” ",
UPPER(LEFT(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),4),1)),
LOWER(MID(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),4),2,(LEN(UPPER(INDEX(SPLIT( CONCATENATE([Nome] , " “, [Sobrenome]),” "),4)))-1))
)
)