I figured this out after a couple more hours of investigating.
The problem was indeed .NET upgrade assistant. When upgrading from .NET framework 4.7.2 to .NET 8.0, upgrade assistant had set GenerateAssemblyInfo to False in the csproj file, but then deleted the assemblyinfo file and put the fileversion and assemblyversion into the csproj file instead.
I have no idea why it did that, but after deleting the GenerateAssemblyInfo False line (could also set it to true, but true is the default) the compiler was properly reading the csproj file for the assembly version information.
You could also manually copy/paste the old assemblyinfo file contents into a random file in your application as that apparently works now (I had placed it at the top of the Form1.cs file), but I think the intention going forward is to have that placed in the csproj file as propertygroup items. Copying the old assemblyinfo lines could lead to confusion later (and in fact could cause exceptions in some cases).