The generics implemented in MiniZinc are undocumented and maybe more intended for internal use.
The number of $ does indeed have a big difference. A type variable with a single $, e.g., $T, can take any type including int, enums, records, strings, etc. A type variable with two $, e.g. $$T, can take any enumerable type. So it is limited to enums, integers, and Boolean values.
Note that other modifiers ("var", "opt", "set of", etc.) can be used to further restrict the types that a type variable can take. For example, "set of $T", can only be float, int, or enum, as no other set types exist in MiniZinc.