Convert list of parameters to a string that can be invoked
Here's what I've been able to come up with so far. It could probably be improved further.

function Pack {
    param(
        [Parameter(Mandatory=$true)]
        [string] $nuspec,

        [string] $OutputDirectory,

        [string] $BasePath,

        [ValidateSet("normal", "quiet", "detailed", IgnoreCase = $true)]
        [string] $Verbosity,

        [switch] $Symbols 
    )

    # these parameters are passed as name - value pairs
    $named = @('OutputDirectory', 'BasePath', 'Verbosity') 

    # these parameters are passed as switches
    $keyed = @('Symbols')

    $p = $PSBoundParameters
    Write-Log "Creating package..." -ForegroundColor Green
    $output = Invoke-Command {
            .\NuGet.exe "pack" $nuspec ($p.Keys | foreach { 
                If ($named -contains $_) { "-$_", $p[$_] } 
                ElseIf ($keyed -contains $_) { "-$_" } 
            })
        } -ErrorVariable error

    Write-Log $output
    Write-Log $error Error
    Write-Log " "

    $global:ExitCode = $LastExitCode
}