package-upgrade, when invoked interactively, does show the list of upgradeable packages. When combined with a decent minibuffer completion configuration (like Daniel's Vertico), I can cherry-pick or select all. I agree package-update-all has a poor interface and I do not use it. package-upgrade perhaps should also refresh the package list when called interactively and suppress that behavior with a prefix argument.
In the security vein, package-upgrade commands could also show both the current version(s) and the target version(s) which would be convenient and assist people willing to put in the work to actually look at package sources before they upgrade.