One way, my favorite, of defining the chern classes goes as follows: first compute $H^*(BU; \mathbb{Z})=\mathbb{Z}[c_1, c_2, ...]$ by using your favorite method. I know two methods, one is using some cellular description of the grassmanians (see Milnor and Stasheff), the other is to first compute the cohomology of the lie groups $U(n)$ and then use a path-loop space fibration and the Serre SS to get at the cohomology of $H^*(BU(n);\mathbb{Z})$ (see Homology and Euler characteristics of the classical Lie groups). Next you notice that $BU$ and $BU(n)$ have the same cell structure through a range and so you essentially take the limit (colimit, and there are some subtleties here, the place I recall seeing these is in Jacob Lurie's survey on elliptic cohomology, at the beginning).
Next suppose you have a complex vector bundle $\xi : E \to B$ then it is classified by a map $f: B \to BU(n)$ where n is the dimension of $\xi$. You can get a map on all of $BU$ by just adding on trivial bundles to get a map out of $BU(k)$ for all $k$ larger than $n$. This gives a map out of BU (although technically you don't really need this, $BU(n)$ works fine for defining the chern classes of an $n$ dimensional complex vector bundle). Now define $c_n(\xi):=f^*(c_n)$.
From this perspective we started with the universal case, so maybe it is a bit of a cheat. For me this even clarifies how I should think about characteristic classes in general. Suppose you want to look at $G$-bundles and see what you can tell about them from $E$-theory ($E$ some ring spectrum and $G$ some compact lie group or whatever you need for $BG$ to be nice, I am not sure if there are other restrictions for this to work). Now compute $E^*BG$ and use the fact that $G$-bundles over $X$ are classified by homotopy classes $X \to BG$. You should check out some of the threads on MO about characteristic classes, I think I can learn something from each of Rezk's answers.
please let me know if I can make some of the above clearer or if there are any mistakes.