This should do it:
SELECT t.id AS group_id,
       t.name AS group_name,
       MAX(CASE t.row_num WHEN 1 THEN t.date ELSE NULL END) AS date_1,
       MAX(CASE t.row_num WHEN 2 THEN t.date ELSE NULL END) AS date_2,
       MAX(CASE t.row_num WHEN 3 THEN t.date ELSE NULL END) AS date_3
  FROM (SELECT t1.id,
               t1.name,
               t2.date,
               ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY t2.date DESC) row_num
          FROM TAB_1 t1
          LEFT OUTER JOIN TAB_2 t2
            ON t1.id = t2.group_id) t
 GROUP BY t.id, t.name
It uses ROW_NUMBER() to rank dates for each group, and then selects the correct one for each column.
First step: rank the dates for each group
[group_id]  [group_name]   [date]      [row_num]
1           Group 1        2018-03-09  1
1           Group 1        2018-03-06  2
1           Group 1        2018-03-03  3
2           Group 2        2018-03-08  1
3           Group 3        NULL        1
Second step: direct dates to the right column
[group_id]  [group_name]   [date_1]       [date_2]       [date_3]
1           Group 1        2018-03-09     NULL           NULL
1           Group 1        NULL           2018-03-06     NULL
1           Group 1        NULL           NULL           2018-03-03
2           Group 2        2018-03-08     NULL           NULL
3           Group 3        NULL           NULL           NULL
Third step: get the MAX() for each column
[group_id]  [group_name]   [date_1]       [date_2]       [date_3]
1           Group 1        2018-03-09     2018-03-06     2018-03-03
2           Group 2        2018-03-08     NULL           NULL
3           Group 3        NULL           NULL           NULL
It looks like MySQL doesn't have this analytic function though. I don't have much experience on MySQL, but maybe you could make it work anyway. Please check this out: ROW_NUMBER() in MySQL