SELECT with WHERE and CASE
You have several problems with the query you listed:


In the first test, you use and AND instead of an OR or an IN (I perfer IN -- in fact, I would prefer it in all cases so that it is easy to extend later, but that is your choice)
You are nesting your case statements. You only want a single case statement, with multiple conditions. What you have is basically a nested if statement. 
You never terminated the last case statement with an ELSE clause (I use ELSE 0 below, but in some cases, ELSE 1=0 OR ELSE FALSE might be needed to render a boolean value -- ELSE NULL should work too). 
You have a LEFT JOIN that is converted into a JOIN because of the WHERE clause... I think that is what you actually want, but you should double check


The query should look more like this:

SELECT id_Cases, name, date_surgery, task_id, current
FROM cases
JOIN progress ON progress.case_id = cases.id_cases
WHERE archive = 0
  AND done = 0
  AND CASE name
    WHEN 'Cranioplasty' THEN task_id IN (103006, 103002) 
    WHEN 'Bone Tumor' THEN task_id = 201006 
    WHEN 'Osteotomy' THEN task_id = 301002 
    WHEN 'MBIO' THEN task_id = 401006 
    ELSE 0
  END
ORDER BY name, date_surgery;


I think this is what you want. If you really want the LEFT JOIN, it would look like this:

SELECT id_Cases, name, date_surgery, task_id, current
FROM cases
LEFT JOIN progress ON progress.case_id = cases.id_cases
    AND CASE name
      WHEN 'Cranioplasty' THEN task_id IN (103006, 103002) 
      WHEN 'Bone Tumor' THEN task_id = 201006 
      WHEN 'Osteotomy' THEN task_id = 301002 
      WHEN 'MBIO' THEN task_id = 401006 
      ELSE 0
    END
WHERE archive = 0
  AND done = 0
ORDER BY name, date_surgery;