unity – How do I detect if my object is grounded?

As @DMGregory pointed out, there are soo many tutorials on this subject, but since I have just answered a similar question (https://stackoverflow.com/a/66938817/1405906) I will try to address some parts of your code:

I assume that the collider (bc) is connected to your player. If so, bc.gameObject.name, will always be the name of your player object. That is why isGrounded never is set to true.

if(bc.gameObject.name == "Grid") {
        isGrounded = true;
        NumberJumps = 0;

Physics should be done in FixedUpdate(), so that is good, but you should not try to get the input there. You might miss “one-time” events like a jump since it is not guaranteed that FixedUpdate() will be called in every frame. Move the check to Update() and store the jump flag in a boolean.

bool jump = false;
    if( Input.GetButtonDown("Jump") )
        jump = true;

Since you want to support a double jump (or more), the ground check should only be done before the first jump is launched. Once jumping, the player is in the air and there is no ground – but you still want to be able to do the second jump.

        if( isGrounded || (NumberJumps>0 && NumberJumps<MaxJumps)
            rb.AddForce(Vector2.up * jumpHeight);
            NumberJumps += 1;
        jump = false; // Remember to reset the jump flag.
    controller.Move(horizontalMove * Time.fixedDeltaTime, false, false);

Now it should work. For more information on how to do the ground-check, see my answer above, or google. Remember to reset the NumberJumps to 0 as soon as you are grounded. Good luck!