Set environment.extraOutputsToInstall = [ "dev" ] - This makes include and I guess .o, .so files available for all packages listed in environment.systemPackages. See [1]
Set environment.variables.C_INCLUDE_PATH = "${nixpkgs.expat.dev}/include" - This makes them available for GCC
I usually use nix-locate to find the package/output in which the header lives. Including it in buildInputs is usually enough for the compiler to find it.