Basically, the genotype can be made of anything you want it to be made of. The only catch is that it must be "evolvable", i.e. you must have some recombination and mutation operator defined (or at least the mutation). As long as you have this, you are good to go.
I have written a blog post about the troubles with the binary representation when dealing with floating point numbers. The solution is not to represent the numbers in binary but rather use the numbers directly as a parto of the genotype. Once your genotype is a sequence of real numbers (as opposed to the sequence of 0s and 1s), your mutation and recombination operators change dramatically - you usually use stochastic procedures for generating and combining new solutions.
Another example is (tree-based) genetic programming - again, it's nothing more than a genetic algorithm where the representation is other than the binary string. Though it is much more complex thing than ordinary GA, it is still the same idea - a representation with a crossover and mutation operator defined.
Another approach is the genotype-phenotype procedure. Take e.g. the Grammatical Evolution algoritm. It does genetic programming but the representation that is modified during evolution is a binary string (but variable length) and a context-free grammar is used to translate it to a program.
The possibilities are endless :).