Per the documentation: https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-schema-transact-sql?view=sql-server-ver15#permissions
To transfer a securable from another schema, the current user must have CONTROL permission on the securable (not schema) and ALTER
permission on the target schema.
If the securable has an EXECUTE AS OWNER specification on it and the
owner is set to SCHEMA OWNER, the user must also have IMPERSONATE
permission on the owner of the target schema.
All permissions associated with the securable that is being
transferred are dropped when it is moved.
CONTROL on the database, schema or individual tables should work. There isn’t much difference between CONTROL at the db level vs db_owner, so it might be better to temporarily grant db_owner and then remove it vs directly granting CONTROL permissions.
Auditing members of the db_owner role is a straight forward, simple process. Sorting through custom permission grants is substantially less clear.