sendall keeps the recipients that were given without an amount as the strings the user passed (spend.cpp:1399). Later it finds their outputs by comparing against EncodeDestination of each output script (spend.cpp:1564), which for bech32 is the canonical lowercase form.
An address given in uppercase is valid bech32, and validateaddress and sendtoaddress accept it. In sendall it never matches, so its output keeps the placeholder amount of 0 and the call fails:
sendall '["BCRT1Q..."]'
error code: -8
Specified output amount to bcrt1q... is below dust threshold.
This stores the decoded destinations of those addresses instead and compares them with the destinations of the outputs, so the match doesn't depend on how the address was written. Invalid addresses are still rejected later when the transaction is constructed.
The new sendall_uppercase_address in wallet_sendall.py sweeps the wallet to the uppercase form of an address. It fails on master with the dust error above and passes with the fix. wallet_send.py still passes.