How to determine if transaction is going to propagate? So I am creating a transaction using TransactionBuilder like this:

var builder = new TransactionBuilder();
Transaction tx = builder
  .AddCoins(coins)
  .AddKeys(privateKeys)
  .Send(recipientAddress, Money.Coins(amount))
  .SetChange(changeAddress)
  .SendFees(Money.Coins(fee))
  .BuildTransaction(sign: true);

Boolean verified = builder.Verify(tx);


And then I propagate it to the network like so:

using (var node = Node.ConnectToLocal(network)) 
{
    node.VersionHandshake(); 

    node.SendMessage(new InvPayload(InventoryType.MSG_TX, tx.GetHash()));

    node.SendMessage(new TxPayload(tx));
    Thread.Sleep(500); 
}


I have two questions:


What does the builder.Verify(tx) even tell us? It returns a boolean, but sometimes I can propagate transactions that returned false. What does verify mean/do?
Since Verify() doesn't really tell us if a transaction will successfully propagate, how do I determine when a transaction made using TransactionBuilder will or won't propagate to the network?
Verify() verifies if the transaction is properly signed.  


  Since Verify() doesn't really tell us if a transaction will successfully propagate 


It is either untrue or you found a bug.  

node.SendMessage(new TxPayload(tx)); should be perfect. However Stratis is currently building a Bitcoin .NET fullnode, with the lead of Nicolas Dorier, NBitcoin's creator, so you should be sure the method they are using is up to date. In their tests, they are doing it a little differently:  

node.VersionHandshake();
node.SendMessageAsync(new InvPayload(transaction));
node.SendMessageAsync(new TxPayload(transaction));
node.PingPong();


I cannot explain why two SendMessageAsync and PingPong is there. You might want to figure out.  

To make sure you might want to ask some other nodes if they have the transaction in their mempool you are connected to, to check the propagation.
Like this:  

bool broadcasted = false;
foreach(var txid in node.GetMempool())
{
    if(txid.Equals(tx.GetHash()))
    {
        broadcasted = true;
    }
}  


Alternatively you can ask your node only. I strongly suspect the transaction would not get into your (Bitcoin Core) mempool if there is something wrong, but you should not rely on that. Theory not always mimics practice.  

Privacy concerns: if you broadcast a transaction without Tor, interested parties can note it and come to conclusions.