There exists an old and well established connection between lattice code design for the additive white Gaussian noise (AWGN) channel and the mathematical theory of lattices. Code design principles can be translated into the language of geometry of numbers and are related to the most central problems in classical lattice theory. These connections appear both in the practical design of short lattice codes, and also in the asymptotic regime when designing codes that perform well from the capacity point of view. However, when considering modern wireless channels, one must take into account new features such as time or frequency selective fading and multiple antennas. Such channels can not be abstracted into a simple AWGN model, and require a different coding strategy. While in recent years plenty of research has been done on code design for fading channels, few works have focused on the problem of approaching capacity. In this survey, we review and generalize our recent works and show how it is possible to perform code design for a large class of different fading channels from a unified perspective and how this approach can be used to build very robust lattice codes that perform within a constant gap from the corresponding capacity. Our approach can be seen as a generalization to fading channels of the classical connection between sphere packing problems and design of capacity approaching lattice codes.