Yes, *.generated.h is generated header file required for reflection system to work, if you use UENUM and USTRUCT (which is not required to add btw, but needed if you want to use those in blueprints) you need to include generated header in that file so UHT can add extra stuff needed for reflection.
In technical state point C++ does not divide files by types, for it header files and cpp files are same thing and #include is pasting one file to another. Because C and C++ compilers compile files individually, you need to declere things in sperete file (header file) so you don’t compile things twice or more but still make compiler aware of classes. So generally it does not matter for compiler where you place things, but for higene reason declaring should be in header file, definitions in cpp files, also UHT, reponcible for generating reflection code scans only header files.
So in short it’s ok to place Enums and Struct in seperate header file.
Also don’t forget about #pragma once, it prevents inclusion of file twice and prevent compiler thinking theres 2 declarations of same things (because double include) which would throw you a error. As i said main function of #include is paste file in file