Do you have only two languages? If so, you could try below solution:
WITH
my_data AS
( SELECT 1 AS id, 'NL' AS language, 'DUTCH CAPTION' AS caption FROM dual
UNION ALL SELECT 1 AS id, 'F' AS language, 'FRENCH CAPTION' AS caption FROM dual
UNION ALL SELECT 2 AS id, 'NL' AS language, 'DUTCH CAPTION' AS caption FROM dual
UNION ALL SELECT 3 AS id, 'F' AS language, 'FRENCH CAPTION' AS caption FROM dual)
SELECT
id, language, caption
FROM my_data md
UNION ALL
SELECT
id, DECODE(language, 'NL', 'F', 'NL'), caption
FROM my_data md
WHERE NOT EXISTS (SELECT 1
FROM my_data
WHERE id = md.id
AND language != md.language)
ORDER BY id, language;