As people noticed, Revit .NET API has inconsistencies here and there. Group and Assembly creations are among them.
Though there are looking straightforward APIs (AssemblyInstance.Create and Document.NewGroup) for creating them, setting their names will behave very different. The Group creation behaves normal, after the Group is created, its type (GroupType) can be accessed right away thus to get its name updated. The Assembly however always returns a null type id using the GetTypeId() method call no matter if the call is made right after the CreateAssembly call or after all views are properly set.
The only workaround as found out through quite some trials and errors is to keep the Assembly element id, commit the current transaction, and start another one to access the type through the same GetTypeId() call. It not only behaves very different from Group creation and name setting, but also gives users some wrong message since two transactions have to be rolled back if they don't like the Assembly that is being created by addins. By the way, sub-transactions do not work in this case, as also tried out.
Anyway, we finally worked around the odd behavior. Lucky us!