It's currently not possible to import (solvable) SegWit addresses (P2SH and native) using `importmulti`. I believe that's a shortcoming we should address before release.

My suggestion would be for P2WPKH (P2SH and native) to be supported without any extra arguments. This means that a P2WPKH address/script with corresponding private or public key should work. For P2SH it means checking if the supplied P2SH address perhaps matches the supplied public key or private key when converted to P2WPKH first.

To support P2WSH, I think we need an extra field "witnessScript". When supplied, it would either be required to match a P2WSH address/script directly, or if the address is P2SH, indirectly.
{
    if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
        throw std::runtime_error(
            "createwallet \"wallet_name\" ( disable_private_keys )\n"
            "\nCreates and loads a new wallet.\n"
            "\nArguments:\n"
            "1. \"wallet_name\"          (string, required) The name for the new wallet. If this is a path, the wallet will be created at the path location.\n"
            "2. disable_private_keys   (boolean, optional, default: false) Disable the possibility of private keys (only watchonlys are possible in this mode).\n"
            "\nResult:\n"
            "{\n"
            "  \"name\" :    <wallet_name>,        (string) The wallet name if created successfully. If the wallet was created using a full path, the wallet_name will be the full path.\n"
            "  \"warning\" : <warning>,            (string) Warning message if wallet was not loaded cleanly.\n"
            "}\n"
            "\nExamples:\n"
            + HelpExampleCli("createwallet", "\"testwallet\"")
            + HelpExampleRpc("createwallet", "\"testwallet\"")
        );
    }
    std::string wallet_name = request.params[0].get_str();
    std::string error;
    std::string warning;
    bool disable_privatekeys = false;
    if (!request.params[1].isNull()) {
        disable_privatekeys = request.params[1].get_bool();
    }
    fs::path wallet_path = fs::absolute(wallet_name, GetWalletDir());
    if (fs::symlink_status(wallet_path).type() != fs::file_not_found) {