Thanks for the info.
Yes, the Azure DevOps service connection has both Get and List permissions on the Azure Key Vault. (In fact, we already have other pipelines accessing the key vault already via this same service connection.) I can confirm seeing the service principal with Get, List permissions in the key vault's access policy.
Key vault is not empty.
When creating the Variable Group to link to the key vault, I clicked Authorize which re-granted the service principal to have Get, List access and shows correctly in the key vault's access policy. This is the point where it is stuck. The Save button is still grayed out.
The reason I know that after clicking the Authorize button, it can grant the service principal with Get, List access in the key vault's access policy. As a test, I deleted this item from the access policy (as mentioned it was already there). Then I clicked the Authorize button and saw it created the Get, List access for the service principal in the access policy. This confirms the service connection is working and the access policy is correct, it still doesn't let me proceed. The Save button is still grayed out.
This looks like a bug.