I would like to know what the differences are between a task group and a task list. Are they purpose the same or there are times when it's better to use one or the other?.
A task_list doesn't do anything really meaningful: there's no difference between spawning a task_list and spawning each of its tasks, other than convenience and perhaps some performance (although by the time you get to notice that you'd probably be much better off with recursive parallelism).
A task_group is something "real": it has children and a context.
It's all in the documentation...