Both of your questions have no straightforward answer. There are different strategies to tackle them but they really depend on your assessment of your team as the whole and individual team members, their temperaments, their skill sets etc. You have to play it by ear and make decisions based on information at hand.
Some developers prefer the tasks to be assigned to them. This does not mean anything bad - it's just a sign that the person would prefer the manager to be more involved in his work.
Some developers prefer to select what they will do. You would usually be happier with the situation where the developer picks his own tasks as it means that he's more involved in your project. AFAIK most Agile methodologies would recommend that the team members should pick their tasks, as this is more in line with the 'committed' mindset Agile wants in the team.
As for the spreading the knowledge - you need to maintain a balance between creating a bottleneck by making a certain developer the only source of knowledge in a particular area and trying to spread the knowledge too thin in the team creating a 'jack-of-all-trades-master-of-none' kind of situation.
I usually try to make all of my 'specialist' to work as part of a mini-team and train one or two of their peers so the there is more than one person who is familiar with any area at any given time.