>You also need to master the basics elements
>such as generics, delegates, interfaces, etc.
I'm a fan of generics, but I don't delude myself into thinking that they're required knowledge. You can get by without writing a single generic class or method and still be an non-novice. Laundry lists of "learn this or you're a n00b13" are quite pointless. The difference between a beginner, a non-beginner, and an expert is much like the difference between bad code and good code. You know it when you see it, but there's not a perfect methodology for sniffing it out.
>Design patterns are, in my opinion, what separate beginners from experienced.
I agree thoroughly. Beginners use design patterns because they lack design experience. Experienced programmers don't need them because they have the requisite experience.
>It impossible to call anyone a professional programmer. May be one in a million.
Erm, not really. A professional programmer is a programmer that gets paid to program. That's the primary definition of "professional". If by "professional" you mean "guru", then I'd agree. Gurus are a myth.
>You can call yourself an expert only when you have the skills and experience
You can call yourself an expert only when a large enough sampling of your peers call you an expert.