ランタイムでシェーダをコンパイルするときに、毎回実機でコンパイルエラーを確認するのは辛いですね。
なので、シェーダのプリコンパイルを挟んだ上で実機でコンパイルすることで実行前にシェーダの記述エラーに気がつくことができます。
具体的にはmetalファイルをプリコンパイルした上で、defaultLibraryを使わずにmetalファイルからソースコードを読み込んで実機でコンパイルすれば良いわけです。
しかし、XcodeはMetalファイルを検知すると問答無用でプリコンパイルしてしまう 1 ためmetalファイルをそのままアプリにバンドルするにはひと工夫必要です。
まず次のようにフォルダにファイルを配置します。

この状態で、フォルダをXcodeにD&Dして「Create folder references」として登録します。

次のように追加したディレクトリが青色のアイコンで登録されれば、このディレクトリ内のmetalファイルは直接バンドルされるようになります。

しかしこのままではコンパイル対象にならないため、metalファイルをツリー内でD&Dしてリファレンスフォルダの外に追加します。

この状態では、Example/Default.metalはプリコンパイルの対象となり、Example/Shader/Default.metalはバンドル対象になります。
また、両方のファイルの参照は同じため片方を編集したらもう片方をコピペするような作業は不要になります。
実際にバンドルされたmetalファイルを呼び出す際は
let url = Bundle.main.url(forResource: "Shader/Default", withExtension: "metal")!
と、フォルダ名を入れてurlを取得します。
-
CompileSourcesPhaseから消してCopy Bundle Phaseに入れてもプリコンパイルします。 ↩