Well, it depends on your personal preferences and the requirements of the application. One big advantage of enums is to define a limited set of numeric values that even the compiler and development environment are aware of, and replacing them with a collection of strings negates that. This might also be important if you want to store the enum value in a database field at some point.
If performance isn't a big issue, you could decorate your enum with DescriptionAttributes to associate them with string names, or any other metadata you want:
internal enum Genders
{
[Description("boy")]
Male,
[Description("girl")]
Female,
[Description("oh-boy")]
NotSure,
[Description("cow")]
Other
}
...and then retrieve the descriptions using reflection as needed. Not lightning fast, but I do this fairly often with labels that are going to be displayed in a WPF form, where a handful of GetCustomAttributes() calls are the least of my performance concerns. :)
If you want to get fancy, one advantage of this approach (as opposed to hard-coded strings) is that you can tie your descriptions to strings contained in the application resources (so you could, for example, have localized versions for different languages). I believe Microsoft takes this approach for some of their libraries (or am I thinking of something else?). And of course you can retrieve the name of the enum member as defined in your code simply by invoking ToString() on the enum value.
You can also enumerate over the members of an enum with the Enum.GetValues() method. So really, you can do the things you're looking for either way, it's just a matter of whether it's worth it to you to complicate things or keep them simple.