As the author of TimeZoneNames library, I can explain why this happens.
First, America/Phoenix
maps to the America_Mountain
metazone in the CLDR metaZones.xml
file
<timezone type="America/Phoenix">
<usesMetazone mzone="America_Mountain"/>
</timezone>
Other time zones are also in the same meta zone:
<timezone type="America/Denver">
<usesMetazone mzone="America_Mountain"/>
</timezone>
Then, in each CLDR language file, such as the en.xml
file for English, you'll see the America_Mountain
metazone entry with its localized strings:
<metazone type="America_Mountain">
<long>
<generic>Mountain Time</generic>
<standard>Mountain Standard Time</standard>
<daylight>Mountain Daylight Time</daylight>
</long>
<short>
<generic>MT</generic>
<standard>MST</standard>
<daylight>MDT</daylight>
</short>
</metazone>
So, there's no information in CLDR as to whether or not DST is applicable in Arizona or not. Keep in mind that Arizona did indeed have DST in the past - last in 1967. So without TZDB data like that you would find in Noda Time, you can't make the determination of whether DST is in effect or not for some particular point in time.
Jon's answer shows how you would test for if DST is in effect using Noda Time. Once you have the result, you can choose the standard or daylight string from TimeZoneNames accordingly.
As for the Generic name, that is typically used when a human being is referring to the time zone in general, and not to either the daylight time portion or the standard time portion. One use case for this is in time zone selection, such as is demonstrated here.