Actually, there’s a difference in how the tags can be defined internally (I read the specifications some time ago to write my own tagger application):
ID3v2.3 (see 4.2.1) allows as many ID3v1 number genres as you want, plus one custom one:
If you want more custom ones here, you can separate them like in ID3v2.4, hoping that apps will recognize that, the standard says that everything after the first zero byte should be ignored though.
ID3v2.4 (see 4.2.3) allows an unlimited amount of genres, all separated by a zero byte:
The problem is that many taggers do this wrong – some read only one genre, some mix up these two standards, etc..
ID3-TagIT does the zero byte to separate even for ID3v2.3, for example, but was for some time the only one I knew.
TagsRevisited supports a method that (I hope) follows the standard quite well; inside the GUI, you can specify multiple genres by separating them with a semicolon, which will upon saving be converted to the representation of the chosen ID3v2 version. In ID3v2.4, it’ll save each category as text, not a number through, since some applications like SlimServer seem to cannot handle the number representation in ID3v2.4.